/**
 * Created by jiachenpan on 16/11/18.
 */



//判断两个对象相等
export function isObjectValueEqual(a, b) {   
 
    //取对象a和b的属性名

  var aProps = Object.getOwnPropertyNames(a);

  var bProps = Object.getOwnPropertyNames(b);

    //判断属性名的length是否一致

  if (aProps.length != bProps.length) {

      return false;

  }

    //循环取出属性名，再判断属性值是否一致

  for (var i = 0; i < aProps.length; i++) {

      var propName = aProps[i];

      if (a[propName] !== b[propName]) {

          return false;

      }

 }

 return true;

}

/* 字段不能全为空白字符 */
export function isNotBlankInput(str) {
  return str && str.trim().length > 0
}

/* 合法用户名称 */
export function isvalidUsername(str) {
const reg = /^[a-zA-Z0-9_-]+((\.)?[a-zA-Z0-9_-]+)+$/
return reg.test(str.trim())
}

/* 合法uri*/
export function validateURL(textval) {
const urlregex = /^(https?|ftp):\/\/([a-zA-Z0-9.-]+(:[a-zA-Z0-9.&%$-]+)*@)*((25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9][0-9]?)(\.(25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9]?[0-9])){3}|([a-zA-Z0-9-]+\.)*[a-zA-Z0-9-]+\.(com|edu|gov|int|mil|net|org|biz|arpa|info|name|pro|aero|coop|museum|[a-zA-Z]{2}))(:[0-9]+)*(\/($|[a-zA-Z0-9.,?'\\+&%$#=~_-]+))*$/
return urlregex.test(textval)
}

/* 小写字母*/
export function validateLowerCase(str) {
const reg = /^[a-z]+$/
return reg.test(str)
}

/* 大写字母*/
export function validateUpperCase(str) {
const reg = /^[A-Z]+$/
return reg.test(str)
}

/* 大小写字母*/
export function validatAlphabets(str) {
const reg = /^[A-Za-z]+$/
return reg.test(str)
}
/** 纯数字 */
export function validateNumber(str) {
const reg = /^[0-9]*$/
console.log(2222, reg.test(str))
return reg.test(str)
}
/** 不能出现汉字的 */
export function validateNoChinese(str) {
const reg = /^[^\u4e00-\u9fa5]+$/
return reg.test(str)
}

/** 长度不能大于1000 */
export function validateLengthForOneThousand(str) {
if (str && str.length <= 1000) {
 return true
} else {
 return false
}
}
/** 地址长度不能大于 512 */
export function validateLengthForFiveThousand(str) {
if (str && str.length <= 512) {
 return true
} else {
 return false
}
}
/** 长度不能大于300*/
export function validateLengthForThreeHundred(str) {
if (str && str.length <= 300) {
 return true
} else {
 return false
}
}
/** 输入名称长度 不能大于100 */
export function validateLengthForOneHundred(str) {
if (str && str.length <= 100) {
 return true
} else {
 return false
}
}
/** 长度不能超过64 */
export function validateLengthForSixtyFor(str) {
if (str && str.length <= 64) {
 return true
} else {
 return false
}
}
/** 长度不能超过32 */
export function validateLengthForThirtyTwo(str) {
if (str && str.length <= 32) {
 return true
} else {
 return false
}
}
/** 长度不能超过16 */
export function validateLengthForSixteen(str) {
if (str && str.length <= 16) {
 return true
} else {
 return false
}
}
/** 电话号码 */
export function isvalidPhone(str) {
const reg = /^1(3|4|5|6|7|8|9)\d{9}$/
return reg.test(str)
}
/**
* 判断手机号码是否正确
*/
export function isvalidatemobile(phone) {
  // 增加134 减少|1349[0-9]{7}，增加181,增加145，增加17[678]
  var isMob = /^((\+?86)|(\(\+86\)))?(13[0123456789][0-9]{8}|15[012356789][0-9]{8}|18[012356789][0-9]{8}|14[57][0-9]{8}|17[3678][0-9]{8})$/
  return isMob.test(phone);
}
/** 货币 */
export function ismoney(str) {
const reg = /^[0-9]+([.]{1}[0-9]+){0,1}$/
return reg.test(str)
}

/** email校验 */
export function isvalidEmail(str) {
const reg = /^[a-z0-9]+([._\\\\-]*[a-z0-9])*@([a-z0-9]+[-a-z0-9]*[a-z0-9]+.){1,63}[a-z0-9]+$/
return reg.test(str)
}

/** 身份证校验1 */
// export function isvalidIdCard(str) {
//   const reg = /^[1-9]{1}[0-9]{5}(19|20)[0-9]{2}((0[1-9]{1})|(1[0-2]{1}))((0[1-9]{1})|([1-2]{1}[0-9]{1}|(3[0-1]{1})))[0-9]{3}[0-9xX]{1}$/
//   return reg.test(str)
// }

// 身份证校验2
/**
* 检验身份证号码是否符合规范
*
* @param IDStr 身份证号码
* @return 错误信息或成功null
*/
export function isvalidIdCard(IDStr) {
var tipInfo = null// 记录错误信息
var Ai = ''
// 判断号码的长度 15位或18位
if (IDStr.length !== 15 && IDStr.length !== 18) {
 tipInfo = '身份证号码长度应该为15位或18位'
 return tipInfo
}
// 18位身份证前17位位数字，如果是15位的身份证则所有号码都为数字
if (IDStr.length === 18) {
 Ai = IDStr.substring(0, 17)
} else if (IDStr.length === 15) {
 Ai = IDStr.substring(0, 6) + '19' + IDStr.substring(6, 15)
}
if (validateNumber(Ai) === false) {
 tipInfo = '身份证15位号码都应为数字 ; 18位号码除最后一位外，都应为数字'
 return tipInfo
}
// 判断出生年月是否有效
var strYear = Ai.substring(6, 10)// 年份
var strMonth = Ai.substring(10, 12)// 月份
var strDay = Ai.substring(12, 14)// 日期
if (isDate(strYear + '-' + strMonth + '-' + strDay) === false) {
 tipInfo = '身份证出生日期无效'
 return tipInfo
}

var date = new Date()
try {
 if ((date.getFullYear() - parseInt(strYear)) > 150 ||
   (date.getTime() - new Date(strYear + '-' + strMonth + '-' + strDay).getTime()) < 0) {
   tipInfo = '身份证生日不在有效范围'
   return tipInfo
 }
} catch (e) {
 console.error('格式错误', e)
 tipInfo = '身份证日期无效'
 return tipInfo
}

if (parseInt(strMonth) > 12 || parseInt(strMonth) === 0) {
 tipInfo = '身份证月份无效'
 return tipInfo
}
if (parseInt(strDay) > 31 || parseInt(strDay) === 0) {
 tipInfo = '身份证日期无效'
 return tipInfo
}

// 判断地区码是否有效
if (!GetAreaCode(Ai) === undefined) {
 tipInfo = '身份证地区编码错误。'
 return tipInfo
}
if (isVarifyCode(Ai, IDStr) === false) {
 tipInfo = '身份证校验码无效，不是合法的身份证号码'
 return tipInfo
}
// console.log(4444, tipInfo)

return tipInfo
}

/**
* 功能：判断字符串出生日期是否符合正则表达式：包括年月日，闰年、平年和每月31天、30天和闰月的28天或者29天
*
* @param string
* @return true, 符合; false, 不符合。
*/
export function isDate(strDate) {
// var pattern = /^((\\d{2}(([02468][048])|([13579][26]))[\\-\\/\\s]?((((0?[13578])|(1[02]))[\\-\\/\\s]?((0?[1-9])|([1-2][0-9])|(3[01])))|(((0?[469])|(11))[\\-\\/\\s]?((0?[1-9])|([1-2][0-9])|(30)))|(0?2[\\-\\/\\s]?((0?[1-9])|([1-2][0-9])))))|(\\d{2}(([02468][1235679])|([13579][01345789]))[\\-\\/\\s]?((((0?[13578])|(1[02]))[\\-\\/\\s]?((0?[1-9])|([1-2][0-9])|(3[01])))|(((0?[469])|(11))[\\-\\/\\s]?((0?[1-9])|([1-2][0-9])|(30)))|(0?2[\\-\\/\\s]?((0?[1-9])|(1[0-9])|(2[0-8]))))))?$/
const pattern = /((^((1[8-9]\d{2})|([2-9]\d{3}))([-\/\._])(10|12|0?[13578])([-\/\._])(3[01]|[12][0-9]|0?[1-9])$)|(^((1[8-9]\d{2})|([2-9]\d{3}))([-\/\._])(11|0?[469])([-\/\._])(30|[12][0-9]|0?[1-9])$)|(^((1[8-9]\d{2})|([2-9]\d{3}))([-\/\._])(0?2)([-\/\._])(2[0-8]|1[0-9]|0?[1-9])$)|(^([2468][048]00)([-\/\._])(0?2)([-\/\._])(29)$)|(^([3579][26]00)([-\/\._])(0?2)([-\/\._])(29)$)|(^([1][89][0][48])([-\/\._])(0?2)([-\/\._])(29)$)|(^([2-9][0-9][0][48])([-\/\._])(0?2)([-\/\._])(29)$)|(^([1][89][2468][048])([-\/\._])(0?2)([-\/\._])(29)$)|(^([2-9][0-9][2468][048])([-\/\._])(0?2)([-\/\._])(29)$)|(^([1][89][13579][26])([-\/\._])(0?2)([-\/\._])(29)$)|(^([2-9][0-9][13579][26])([-\/\._])(0?2)([-\/\._])(29)$))/
// 上面一个是后后端统一的 但是跑不过去 暂时用下一个
return pattern.test(strDate)
}

// 如果身份证前两位的地区码不在Hashtable，则地区码有误 返回true 或 undefined
export function GetAreaCode(Ai) {
var areacode = ['11', '12', '13', '14', '15', '21', '22', '23', '31', '32', '33',
 '34', '35', '36', '37', '41', '42', '43', '44', '45', '46', '50', '51', '52', '53',
 '54', '61', '62', '63', '64', '65', '71', '81', '82', '91']

for (let index = 0; index < areacode.length; index++) {
 const element = areacode[index]
 if (element === Ai.substring(0, 2)) {
   return true
 }
}
}

/*
* 判断第18位校验码是否正确 第18位校验码的计算方式：
1. 对前17位数字本体码加权求和 公式为：S = Sum(Ai * Wi), i = 0, ... , 16
* 其中Ai表示第i个位置上的身份证号码数字值，Wi表示第i位置上的加权因子，其各位对应的值依次为： 7 9 10 5 8 4 2 1 6 3 7 9 10 5 8 4
* 2
2. 用11对计算结果取模 Y = mod(S, 11)
3. 根据模的值得到对应的校验码 对应关系为： Y值： 0 1 2 3 4 5 6 7 8 9 10
* 校验码： 1 0 X 9 8 7 6 5 4 3 2
*/
export function isVarifyCode(Ai, IDStr) {
var VarifyCode = ['1', '0', 'X', '9', '8', '7', '6', '5', '4', '3', '2']
var Wi = ['7', '9', '10', '5', '8', '4', '2', '1', '6', '3', '7', '9',
 '10', '5', '8', '4', '2']
var sum = 0
for (var i = 0; i < 17; i++) {
 sum = sum + parseInt(Ai.charAt(i)) *
   parseInt(Wi[i])
}

var modValue = sum % 11

var strVerifyCode = VarifyCode[modValue]

Ai = Ai + strVerifyCode
if (IDStr.length === 18) {
 if (Ai !== IDStr) {
   return false
 }
}
return true
}